/**
 * 
 */
package com.shy.base.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.shy.base.vo.EntityTypeValue;
import com.shy.base.vo.QueryResult;

/**
 * <p>Title:BaseDao </p>
 * <p>Description: </p>
 * <p>Company:ipebg </p> 
 * @author H2013788
 * @date 2019年8月7日
 */
public interface BaseDao<T> {

	/**
	 * 通过ID获取指定实体对象
	 * 先从Session一级缓存中查询，再从二级缓存中，最后查询数据库
	 * @param id
	 * @return 返回对象或null
	 */
	T getById(Serializable id);
	
	/**
	 * 按照指定属性查询，如果有多條记录返回第一條
	 * @param propertyName
	 * @param value
	 * @return
	 * @author H2013788
	 * @date 2019年8月15日
	 */
	T getByProperty(String propertyName, Object value);
	
	
	/**
	 * 按照指定属性列表查询，如果有多條记录返回第一條
	 * @param propertyMap
	 * @param value
	 * @return
	 * @author H2013788
	 * @date 2019年8月15日
	 */
	T getByProperty(Map<String, Object> propertyMap);
	
	/**
	 * 按照hql查询唯一
	 * @param hql
	 * @param values
	 * @return
	 * @author H2013788
	 * @date 2020年3月12日
	 */
	T getUnique(String hql, Object... values);
	
	
	/**
	 * 获取所有实体集合
	 * @return
	 */
	List<T> findAll();
	
	
	/**
	 * 获取列表
	 * @param ids
	 * @return
	 * @author H2013788
	 * @date 2019年8月30日
	 */
	List<T> findByIds(Serializable[] ids);
	
	
	/**
	 * 按照指定属性查询，返回列表
	 * @param propertyName
	 * @param value
	 * @return
	 * @author H2013788
	 * @date 2019年8月15日
	 */
	List<T> findByProperty(String propertyName, Object value);
	
	
	/**
	 * 按照指定属性查询，返回列表
	 * @param propertyName
	 * @param value
	 * @param orderField
	 * @param orderDirect
	 * @return
	 * @author H2013788
	 * @date 2019年8月15日
	 */
	List<T> findByProperty(String propertyName, Object value, String orderField, String orderDirect);
	
	
	/**
     * 查询指定条数
     * @param propertyName
     * @param value
     * @param orderField
     * @param orderDirect
     * @param limit
     * @return
     * @author 寒宇
     * @date 2021年7月18日
     */
    List<T> findByProperty(String propertyName, Object value, String orderField, String orderDirect, int limit);
	
	
	/**
	 * 多個属性查询
	 * @param propertyMap
	 * @return
	 * @author H2013788
	 * @date 2019年10月11日
	 */
	List<T> findByProperty(Map<String, Object> propertyMap);
	
	
	/**
     * 按照指定属性查询，返回列表
     * @param propertyMap
     * @param value
     * @return
     * @author H2013788
     * @date 2019年8月15日
     */
    List<T> findByProperty(Map<String, Object> propertyMap, String orderField, String orderDirect, int limit);
	
	
	/**
	 * 按照hql查询
	 * @param hql
	 * @param values
	 * @return
	 * @author H2013788
	 * @date 2020年3月12日
	 */
	List<T>  findList(String hql, Object... values);
	
	
	/**
	 * 保存实体对象
	 * @param entity
	 */
	void save(T entity);
	
	/**
	 * 更新实体对象
	 * @param entity
	 */
	void update(T entity);
	
	/**
	 * 删除实体对象
	 * @param entity
	 */
	void delete(T entity);
	
	/**
	 * 根据id删除指定对象
	 * @param id
	 */
	void deleteById(Serializable id);
	
	/**
	 * 根据多个id删除对象
	 * @param ids
	 */
	void deleteByIds(Serializable ... ids);
	
	/**
	 * 批量保存对象
	 * @param entitys
	 */
	void batchSave(Collection<T> entitys);
	
	/**
	 * 批量更新对象
	 * @param entitys
	 */
	void batchUpdate(Collection<T> entitys);
	
	/**
	 * 批量删除对象
	 * @param entitys
	 */
	void batchDelete(Collection<T> entitys);
	
	/**
	 * 根据对象ID批量删除
	 * @param ids
	 */
	void batchDeleteByIds(Collection<? extends Serializable> ids);
	
	/**
	 * 获取总数
	 * @return
	 */
	long getCount();
	
	/**
	 * 分页获取数据，包含过滤条件及排序规则
	 * @param firstindex
	 * @param maxresult
	 */
	QueryResult<T> getScrollData(Integer firstindex,Integer maxresult);
	
	/**
	 * 分页获取数据，指定过滤条件及排序规则
	 * @param firstindex
	 * @param maxresult
	 * @param wherejql 检索语句
	 * @param queryParams 查询过滤参数
	 * @param orderby 排序规则
	 */
	QueryResult<T> getScrollData(Integer firstindex,Integer maxresult,
			String wherejql,Object[] queryParams,LinkedHashMap<String,String> orderby);
	
	/**
	 * 分页获取数据，指定过滤条件及排序规则
	 * @param firstindex
	 * @param maxresult
	 * @param wherejql 检索语句
	 * @param queryParams 查询过滤参数,名称绑定
	 * @param orderby 排序规则
	 */
	QueryResult<T> getScrollDataBindName(Integer firstindex,Integer maxresult,
			String wherejql,List<EntityTypeValue> queryParams,LinkedHashMap<String,String> orderby);
	
	/**
	 * 分页获取数据，指定过滤条件及排序规则
	 * @param firstindex
	 * @param maxresult
	 * @param wherejql 检索语句
	 * @param queryParams 查询过滤参数,名称绑定
	 * @param orderby 排序规则
	 * @param groupBy 分組查询規則
	 */
	QueryResult<T> getScrollDataBindName(Integer firstindex, Integer maxresult,
			String wherejql,List<EntityTypeValue> queryParams, LinkedHashMap<String,String> orderby, String groupBy);

}